package com.xjh.basestudy.leetcode.fanxin;

/**
 * @author XuJianHua
 * @version 1.0
 * @company 湖南安第斯信息科技有限公司, 版权所有
 * @date 2022/4/18 11:46
 */
public class UsePair {
    public static void main(String[] args) {
        //泛型类作用：创建该类对象时可传入任意类型的参数
        // 创建 Pair对象时，可传入任意类型的对象，但是这里只能有一种类型
        Pair<Integer> minmax = new Pair<Integer>(1, 100);
        Integer min = minmax.getFirst();
        Integer max = minmax.getSecond();

        // 多种类型的泛型
        MultiplePair<String, Integer> pair = new MultiplePair<String, Integer>("老马", 100);
        //泛型的好处：编译时发现类型错误，已经提前知道需要传入什么类型的参数
        //Integer id = pair.getFirst();
        //String name = pair.getSecond();
        //不用泛型则发现不了，因为并未确定传入的是什么类型，当运行发现类型转换不成功时才能发现
        Pair pair1 = new Pair("老马", 1);
        Integer id1 = (Integer) pair1.getFirst();
        String name1 = (String) pair1.getSecond();

        /**泛型方法调用*/
        indexOf(new Integer[]{1, 3, 5}, 10);
        // 与泛型类不同，调用方法时一般并不需要特意指定类型参数的实际类型，比如调用make-Pair：
        makePair(1, "老马");
    }
    /**
     * 泛型方法理解：与泛型类不同，调用方法传入参数时，不需要一个确定的类型
     */

    /**
     * 泛型方法：找到某个元素，而不确定类型
     */
    // 两个参数：任意类型元素的数组、任意类型的参数，返回类型为任意类型
    public static <T> int indexOf(T[] arr, T elm) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(elm)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 多参数泛型方法
     */
    public static <U, V> MultiplePair<U, V> makePair(U first, V second) {
        MultiplePair<U, V> MultiplePair = new MultiplePair<>(first, second);
        return MultiplePair;
    }
}
